#include <stdio.h>
#include <stdlib.h>

int compare_ints(const void *a, const void *b) {
  return (*(int *)b - *(int *)a);
}

int value[2048], n, m;

int main(void) {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &value[i + i], &value[i + i + 1]);
  }
  scanf("%d", &m);
  for (int i = 0; i < m; i++) {
    int a;
    scanf("%d", &a);
    value[a - 1] = -1;  //不参加的元素标记为-1, 使得它们在排序时被排到末尾
  }
  // 对value的前2n项用qsort按从大到小排序
  qsort(value, 2 * n, sizeof(int), compare_ints);
  int data_count = n * 2 - m, total_value = 0;
  // 计算01,23,45.....方式配对的总代价
  for (int i = 1; i < data_count; i += 2)
    total_value += value[i - 1] - value[i];
  if (data_count &
      1) { // 如果2n-m是奇数, 寻找不组队的元素,
           // 最优不组队元素序号必然是偶数(从0开始),
           // 例如假如奇数序号1不组队的话,组队方式将为02,34,56...其组队代价必然大于元素2不组队时的01,34,56...
    int tmp_value = total_value;
    for (int i = data_count - 2; i > 0;
         i -=
         2) { // i-1为不组队元素, i-1初始值为data_count-3,
              // 因为data_count-1(最后一个)不组队时, 之前计算的总代价不受影响
      tmp_value -=
          value[i - 1] - value[i] * 2 +
          value[i + 1]; // 修正总成本,将i-1,i之间成本剔除, 加入i,i+1之间成本
      if (tmp_value < total_value) // 如果修正后的总成本更小, 则更新最小总成本
        total_value = tmp_value;
    }
  }
  printf("%d\n", total_value);
  return 0;
}
